package sliding_window

/*
1052.
有一个书店老板，他的书店开了n分钟。每分钟都有一些顾客进入这家商店。给定一个长度为 n 的整数数组 customers ，其中 customers[i] 是在第 i 分钟开始时进入商店的顾客的编号，所有这些顾客在第 i 分钟结束后离开。
在某些时候，书店老板会生气。 如果书店老板在第 i 分钟生气，那么 grumpy[i] = 1，否则 grumpy[i] = 0。
当书店老板生气时，那一分钟的顾客就会不满意，若老板不生气则顾客是满意的。
书店老板知道一个秘密技巧，能抑制自己的情绪，可以让自己连续minutes分钟不生气，但却【只能使用一次】。
请你返回 这一天营业下来，【最多】有多少客户能够感到满意 。

示例 1：
输入：customers = [1,0,1,2,1,1,7,5], grumpy = [0,1,0,1,0,1,0,1], minutes = 3
输出：16
解释：书店老板在最后 3 分钟保持冷静。
感到满意的最大客户数量 = 1 + 1 + 1 + 1 + 7 + 5 = 16.

示例 2：
输入：customers = [1], grumpy = [0], minutes = 1
输出：1

提示：
1. n == customers.length == grumpy.length
2. 1 <= minutes <= n <= 2 * 10^4
3. 0 <= customers[i] <= 1000
4. grumpy[i] == 0 or 1

*/

/*
技巧：生气 ---> 不生气
     不生气 ---> 不生气
     将原本满意的客户加入结果集，同时将对应的customers[i]变为0
则问题转化为：在customers中找到连续一段【长度为minutes的子数组】，使得其【总和最大】。
*/
func maxSatisfied(customers []int, grumpy []int, minutes int) int {
	ans := 0
	for i, v := range customers {
		if grumpy[i] == 0 {
			ans += v
			customers[i] = 0 //代表已经计算过了
		}
	}

	cur, m := 0, 0
	for j := 0; j < len(customers); j++ {
		cur += customers[j]
		if j >= minutes {
			cur -= customers[j-minutes]
		}
		m = max(m, cur)
	}
	return ans + m
}
